home *** CD-ROM | disk | FTP | other *** search
/ Libris Britannia 4 / science library(b).zip / science library(b) / CUGUK / PROG_TOO / C027B.ZIP / MAKE / CHECK.C < prev    next >
Text File  |  1990-03-30  |  3KB  |  126 lines

  1. /***************************************************************\
  2.  *                                *
  3.  *  PDMAKE, Atari ST version                    *
  4.  *                                *
  5.  *  Adapted from mod.sources Vol 7 Issue 71, 1986-12-03.        *
  6.  *                                *
  7.  *  This port makes extensive use of the original net.sources    *
  8.  *  port by Jwahar Bammi.                    *
  9.  *                                *
  10.  *      Ton van Overbeek                        *
  11.  *      Email: TPC862@ESTEC.BITNET                *
  12.  *             TPC862%ESTEC.BITNET@WISCVM.WISC.EDU    (ARPA)    *
  13.  *             ...!mcvax!tpc862%estec.bitnet   (UUCP Europe)    *
  14.  *             ...!ucbvax!tpc862%estec.bitnet  (UUCP U.S.A.)    *
  15.  *             71450,3537  (CompuServe)                *
  16.  *                                *
  17.  \***************************************************************/
  18.  
  19. /*
  20.  *    Check structures for make.
  21.  */
  22.  
  23. #include <stdio.h>
  24. #include "h.h"
  25.  
  26.  
  27. /*
  28.  *    Prints out the structures as defined in memory.  Good for check
  29.  *    that you make file does what you want (and for debugging make).
  30.  */
  31. void
  32. prt()
  33. {
  34.     register struct name *np;
  35.     register struct depend *dp;
  36.     register struct line *lp;
  37.     register struct cmd *cp;
  38.     register struct macro *mp;
  39.  
  40.  
  41.     for (mp = macrohead; mp; mp = mp->m_next)
  42.         fprintf(stderr, "%s = %s\n", mp->m_name, mp->m_val);
  43.  
  44.     fputc('\n', stderr);
  45.  
  46.     for (np = namehead.n_next; np; np = np->n_next) {
  47.         if (np->n_flag & N_DOUBLE)
  48.             fprintf(stderr, "%s::\n", np->n_name);
  49.         else
  50.             fprintf(stderr, "%s:\n", np->n_name);
  51.         if (np == firstname)
  52.             fprintf(stderr, "(MAIN NAME)\n");
  53.         for (lp = np->n_line; lp; lp = lp->l_next) {
  54.             fputc(':', stderr);
  55.             for (dp = lp->l_dep; dp; dp = dp->d_next)
  56.                 fprintf(stderr, " %s", dp->d_name->n_name);
  57.             fputc('\n', stderr);
  58.  
  59.             for (cp = lp->l_cmd; cp; cp = cp->c_next)
  60.                 fprintf(stderr, "-\t%s\n", cp->c_cmd);
  61.             fputc('\n', stderr);
  62.         }
  63.         fputc('\n', stderr);
  64.     }
  65. }
  66.  
  67.  
  68. /*
  69.  *    Recursive routine that does the actual checking.
  70.  */
  71. void
  72. check(np)
  73. struct name *np;
  74. {
  75.     register struct depend *dp;
  76.     register struct line *lp;
  77.  
  78.  
  79.     if (np->n_flag & N_MARK)
  80.         fatal("Circular dependency from %s", np->n_name);
  81.  
  82.     np->n_flag |= N_MARK;
  83.  
  84.     for (lp = np->n_line; lp; lp = lp->l_next)
  85.         for (dp = lp->l_dep; dp; dp = dp->d_next)
  86.             check(dp->d_name);
  87.  
  88.     np->n_flag &= ~N_MARK;
  89. }
  90.  
  91.  
  92. /*
  93.  *    Look for circular dependencies.
  94.  *    i.e.
  95.  *        a: b
  96.  *        b: a
  97.  *    is a circular dependency.
  98.  */
  99. void
  100. circh()
  101. {
  102.     register struct name *np;
  103.  
  104.     for (np = namehead.n_next; np ; np = np->n_next)
  105.         check(np);
  106. }
  107.  
  108.  
  109. /*
  110.  *    Check the target .PRECIOUS, and mark its dependents as precious
  111.  */
  112. void
  113. precious()
  114. {
  115.     register struct depend *dp;
  116.     register struct line *lp;
  117.     register struct name *np;
  118.  
  119.     if (!((np = newname(".PRECIOUS"))->n_flag & N_TARG))
  120.         return;
  121.  
  122.     for (lp = np->n_line; lp; lp = lp->l_next)
  123.         for (dp = lp->l_dep; dp; dp = dp->d_next)
  124.             dp->d_name->n_flag |= N_PREC;
  125. }
  126.